package br.com.duosoftware.orcamento.managedbeans;

import br.com.duosoftware.orcamento.daos.CategoriaOrcamentoDAO;
import br.com.duosoftware.orcamento.entidades.CategoriaOrcamento;
import br.com.duosoftware.orcamento.utils.Mensagens;
import java.io.Serializable;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.hibernate.exception.ConstraintViolationException;
import org.primefaces.context.RequestContext;

/**
 *
 * @author Daniel
 * 
 */
@ManagedBean
@ViewScoped
public class CategoriaOrcamentoBean implements Serializable {

    private CategoriaOrcamento categoriaOrcamento;
    private List<CategoriaOrcamento> categoriasOrcamento;
    private final CategoriaOrcamentoDAO categoriaOrcamentoDAO;
    
    public CategoriaOrcamentoBean() {
        
        categoriaOrcamentoDAO = new CategoriaOrcamentoDAO();
        
    }

    public CategoriaOrcamento getCategoriaOrcamento() {
        return categoriaOrcamento;
    }

    public void setCategoriaOrcamento(CategoriaOrcamento categoriaOrcamento) {
        this.categoriaOrcamento = categoriaOrcamento;
    }

    public List<CategoriaOrcamento> getCategoriasOrcamento() {
        if(categoriasOrcamento == null){
            categoriasOrcamento = categoriaOrcamentoDAO.listarCategoriasOrcamento();
        }
        return categoriasOrcamento;
    }

    public void setCategoriasOrcamento(List<CategoriaOrcamento> categoriasOrcamento) {
        this.categoriasOrcamento = categoriasOrcamento;
    }
    
    /**
     * <b>Método que inicializa o CategoriaOrcamento a ser cadastrado.</b><p>
     *
     * @return void
     *
     */
    public void adicionarInicio() {

        categoriaOrcamento = new CategoriaOrcamento();
        
    }

    /**
     * <b>Método que adiciona ou edita um CategoriaOrcamento</b><p>
     *
     * Após o término o método fecha o dialog de cadastro. <p>
     *
     * @return void
     *
     */
    public void adicionarEditarFim() {

        categoriaOrcamentoDAO.salvarOuAtualizar(categoriaOrcamento);
        categoriaOrcamento = new CategoriaOrcamento();
        categoriasOrcamento = null;

        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.execute("dlgCategoriaOrcamento.hide()");
        requestContext.update("formCategoriasOrcamento:dtCategoriasOrcamento");

    }

    /**
     * <b>Método para iniciar o processo de edição de um CategoriaOrcamento.</b> <p>

 Ele verifica se há um CategoriaOrcamento selecionada para edição, se não houver é
 emitida uma mensagem pedindo que o usuário selecione uma.<p>

 Caso haja um CategoriaOrcamento selecionado o médoto abre o dialog para edição<p>
     *
     * @return void
     *
     */
    public void editarInicio() {

        if (categoriaOrcamento == null) {

            Mensagens.mensagemDeAlerta("Selecione um registro", "Selecione um re"
                    + "gistro para Editar");

        } else {

            RequestContext.getCurrentInstance().execute("dlgCategoriaOrcamento.show()");

        }

    }

    /**
     * <b>Método para iniciar o processo de exclusão de um CategoriaOrcamento.</b> <p>

 Ele verifica se há um CategoriaOrcamento selecionado para exclusão, se não houver é
 emitida uma mensagem pedindo que o usuário selecione uma.<p>

 Caso haja um CategoriaOrcamento selecionado o médoto abre um p:dialog para confirma
 ção da exclusão.<p>
     *
     * @return void
     *
     */
    public void excluirInicio() {

        if (categoriaOrcamento == null) {
            Mensagens.mensagemDeAlerta("Selecione um registro",
                    "Selecione um registro para excluir");
        } else {
            RequestContext.getCurrentInstance()
                    .execute("dlgExcluirCategoriaOrcamento.show()");
        }

    }

    /**
     * <b>Método para excluir um CategoriaOrcamento.</b> <p>

 Ele verifica se a CategoriaOrcamento selecionado para exclusão está sendo utilizado
 por alguma outra tabela do banco. Se estiver uma mensagem de aviso é dada
 ao usuário<p>
     *
     * @return void
     *
     */
    public void excluirFim() {

        try {

            categoriaOrcamentoDAO.excluir(categoriaOrcamento);
            categoriaOrcamento = new CategoriaOrcamento();
            categoriasOrcamento = null;

        } catch (ConstraintViolationException e) {
            Mensagens.mensagemDeAlerta("Registro Utilizado",
                    "Esse registro está sendo utilizado");
        }

        RequestContext.getCurrentInstance()
                .execute("dlgExcluirCategoriaOrcamento.hide()");

    }

    /**
     * <b> Método para cancelar uma operação de cadastro ou edição.</b> <p>

 O método instancia um novo objeto na variável CategoriaOrcamento para limpar as
 infomações.<p>
     *
     * @return void
     */
    public void cancelar() {

        categoriaOrcamento = new CategoriaOrcamento();

        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.execute("dlgCategoriaOrcamento.hide()");
        requestContext.update("formCategoriasOrcamento:dtCategoriasOrcamento");

    }
    
}
